Telegram Group & Telegram Channel
🐍 Задача на внимательность и глубокое понимание Python: ловушка `defaultdict` и мутабельных объектов

Представьте, что вы разрабатываете систему трекинга активностей пользователей на сайте. Вам нужно собрать словарь, где каждому пользователю соответствует список его действий.

Вы решаете использовать collections.defaultdict(list) для удобства, и пишете такой код:


from collections import defaultdict

actions = defaultdict(list)

def track(user_id, action):
actions[user_id].append(action)

track('alice', 'login')
track('bob', 'view')
track('alice', 'logout')

# Теперь вы хотите скопировать этот словарь
copy_actions = actions.copy()

# Допишем в оригинал
track('bob', 'logout')

# Посмотрим, как выглядит копия
print(copy_actions['bob']) # Что будет напечатано?


🧠 Вопрос:
Что будет напечатано? Почему?
Как сделать так, чтобы copy_actions не изменился при добавлении новых действий в actions?

💥 Подвох
Метод copy() копирует только верхний уровень словаря. То есть, списки значений не копируются — это всё те же самые объекты в памяти. Поэтому при track('bob', 'logout') список actions['bob'] изменяется, и это тот же самый список, что лежит в copy_actions['bob'].

➡️ Ответ: print(copy_actions['bob']) напечатает ['view', 'logout'].

Как правильно?
Чтобы избежать такой проблемы, используйте глубокое копирование:


import copy

copy_actions = copy.deepcopy(actions)


Теперь copy_actions не изменится при дальнейшем редактировании actions.

📌 Вывод
Даже опытные разработчики иногда забывают: copy() не копирует вложенные структуры данных!
Если в значениях словаря лежат мутабельные объекты, обязательно подумайте — а не нужен ли вам deepcopy()?

🧪 Попробуйте изменить defaultdict(list) на обычный dict — и посмотрите, что изменится.



tg-me.com/python_job_interview/1107
Create:
Last Update:

🐍 Задача на внимательность и глубокое понимание Python: ловушка `defaultdict` и мутабельных объектов

Представьте, что вы разрабатываете систему трекинга активностей пользователей на сайте. Вам нужно собрать словарь, где каждому пользователю соответствует список его действий.

Вы решаете использовать collections.defaultdict(list) для удобства, и пишете такой код:


from collections import defaultdict

actions = defaultdict(list)

def track(user_id, action):
actions[user_id].append(action)

track('alice', 'login')
track('bob', 'view')
track('alice', 'logout')

# Теперь вы хотите скопировать этот словарь
copy_actions = actions.copy()

# Допишем в оригинал
track('bob', 'logout')

# Посмотрим, как выглядит копия
print(copy_actions['bob']) # Что будет напечатано?


🧠 Вопрос:
Что будет напечатано? Почему?
Как сделать так, чтобы copy_actions не изменился при добавлении новых действий в actions?

💥 Подвох
Метод copy() копирует только верхний уровень словаря. То есть, списки значений не копируются — это всё те же самые объекты в памяти. Поэтому при track('bob', 'logout') список actions['bob'] изменяется, и это тот же самый список, что лежит в copy_actions['bob'].

➡️ Ответ: print(copy_actions['bob']) напечатает ['view', 'logout'].

Как правильно?
Чтобы избежать такой проблемы, используйте глубокое копирование:


import copy

copy_actions = copy.deepcopy(actions)


Теперь copy_actions не изменится при дальнейшем редактировании actions.

📌 Вывод
Даже опытные разработчики иногда забывают: copy() не копирует вложенные структуры данных!
Если в значениях словаря лежат мутабельные объекты, обязательно подумайте — а не нужен ли вам deepcopy()?

🧪 Попробуйте изменить defaultdict(list) на обычный dict — и посмотрите, что изменится.

BY Python вопросы с собеседований


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/python_job_interview/1107

View MORE
Open in Telegram


Python вопросы с собеседований Telegram | DID YOU KNOW?

Date: |

How To Find Channels On Telegram?

There are multiple ways you can search for Telegram channels. One of the methods is really logical and you should all know it by now. We’re talking about using Telegram’s native search option. Make sure to download Telegram from the official website or update it to the latest version, using this link. Once you’ve installed Telegram, you can simply open the app and use the search bar. Tap on the magnifier icon and search for a channel that might interest you (e.g. Marvel comics). Even though this is the easiest method for searching Telegram channels, it isn’t the best one. This method is limited because it shows you only a couple of results per search.

Python вопросы с собеседований from sg


Telegram Python вопросы с собеседований
FROM USA